package core.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import util.DbUtils;
import core.dao.CarritoDao;
import core.model.Carrito;
import core.model.Producto;

/**
 * @author andoniibarguchilorenzo
 * clase que contiene los metodos implementados de la interface CarritoDao
 */
public class CarritoDaoImpl extends GenericDaoImpl<Carrito, Integer> implements
		CarritoDao {

	public Carrito findBy(int cod_producto) {
		Connection connection = DbUtils.createInstance();
		PreparedStatement ps = null;
		List<Carrito> carritos = new ArrayList<Carrito>();
		try {
			ps = connection
					.prepareStatement("SELECT P.NOMBRE, E.NOMBRE, C.CANTIDAD, T.PRECIO, T.COD_PRODUCTO FROM PRODUCTO P, EMPRESA E, CONTIENE C, TIENE T WHERE P.COD_PRODUCTO = ? AND P.COD_PRODUCTO=T.COD_PRODUCTO AND E.COD_EMPRESA=T.COD_EMPRESA AND E.COD_EMPRESA=C.COD_EMPRESA AND P.COD_PRODUCTO=C.COD_PRODUCTO");
			ps.setDouble(1, cod_producto);

			ResultSet rs = ps.executeQuery();
			Carrito carrito = null;

			while (rs.next()) {

				carrito = Carrito.createCarrito(rs.getString(1),
						rs.getString(2), rs.getInt(3), rs.getFloat(4),
						rs.getString(5));
				carritos.add(carrito);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return carritos.get(0);
	}

	public Carrito findBy(String nombre_producto) {
		Connection connection = DbUtils.createInstance();
		PreparedStatement ps = null;
		List<Carrito> carritos = new ArrayList<Carrito>();
		try {
			ps = connection
					.prepareStatement("SELECT P.NOMBRE, S.NOMBRE, C.CANTIDAD, T.PRECIO, T.COD_PRODUCTO FROM PRODUCTO P, SUPERMERCADO S, CONTIENE C, TIENE T WHERE P.NOMBRE = ? AND P.COD_PRODUCTO=T.COD_PRODUCTO AND S.COD_SUPERMERCADO=T.COD_EMPRESA AND S.COD_SUPERMERCADO=C.COD_SUPERMERCADO AND P.COD_PRODUCTO=C.COD_PRODUCTO");
			ps.setString(1, nombre_producto);

			ResultSet rs = ps.executeQuery();
			Carrito carrito = null;

			while (rs.next()) {

				carrito = Carrito.createCarrito(rs.getString(1),
						rs.getString(2), rs.getInt(3), rs.getFloat(4),
						rs.getString(5));
				carritos.add(carrito);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return carritos.get(0);
	}
	public List<Carrito> findByLista(int cod_lista) {
		Connection connection = DbUtils.createInstance();
		PreparedStatement ps = null;
		List<Carrito> carritos = new ArrayList<Carrito>();
		try {
			ps = connection
					.prepareStatement("SELECT P.NOMBRE, E.NOMBRE, C.CANTIDAD, T.PRECIO, T.COD_PRODUCTO FROM PRODUCTO P, EMPRESA E, CONTIENE C, TIENE T, LISTA L WHERE L.COD_LISTA = ? AND P.COD_PRODUCTO=T.COD_PRODUCTO AND E.COD_EMPRESA=T.COD_EMPRESA AND E.COD_EMPRESA=C.COD_EMPRESA AND P.COD_PRODUCTO=C.COD_PRODUCTO AND L.COD_LISTA=C.COD_LISTA");
			ps.setDouble(1, cod_lista);

			ResultSet rs = ps.executeQuery();
			Carrito carrito = null;

			while (rs.next()) {

				carrito = Carrito.createCarrito(rs.getString(1),
						rs.getString(2), rs.getInt(3), rs.getFloat(4),
						rs.getString(5));
				carritos.add(carrito);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return carritos;
	}
	public void insertProducto(Producto producto) {

		Connection connection = DbUtils.createInstance();
		PreparedStatement ps = null;
		try {
			// http://db.apache.org/derby/docs/10.7/ref/crefjavstateautogen.html
			ps = connection
					.prepareStatement(
							"INSERT INTO PRODUCTO (COD_PRODUCTO, NOMBRE, DESCRIPCION, CANTIDAD, UNIDAD, COD_SUBCATEGORIA) VALUES (?,?,?,?,?,?)");
			ps.setString(1, producto.getCodigo_barras());
			ps.setString(2, producto.getNombre());
			ps.setString(3, producto.getDescripcion());
			ps.setDouble(4, producto.getCantidad());
			ps.setString(5, producto.getUnidad());
			ps.setInt(6, producto.getCodigo_subcategoria());

			ps.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		}

	}
	public void insertCarrito(int cod_empresa, double cod_producto, int cod_lista, int cantidad) {

		Connection connection = DbUtils.createInstance();
		PreparedStatement ps = null;
		try {
			// http://db.apache.org/derby/docs/10.7/ref/crefjavstateautogen.html
			ps = connection
					.prepareStatement(
							"INSERT INTO CARRITO (COD_EMPRESA, COD_PRODUCTO, COD_LISTA, CANTIDAD) VALUES (?,?,?,?)");
			ps.setInt(1, cod_empresa);
			ps.setDouble(2, cod_producto);
			ps.setInt(3, cod_lista);
			ps.setDouble(4, cantidad);
			ps.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		}

	}
}
